package com.cutebaby.admin.com.autowired;

import org.junit.Test;

import java.lang.reflect.Field;
import java.lang.reflect.Method;

/**
 * @author: xialegemo
 * @description: 使用反射来手写实现注入
 * @date： 2020/10/20 23:06
 **/
public class MyTest {
    // 使用反射来手写实现@AutoWired注入
    // url：https://www.bilibili.com/video/BV1jz4y1f7qd?p=1
    @Test
    public void test() throws Exception {
        // 首先新建一个userController对象，他里面有一个userService属性
        UserController userController = new UserController();
        // 通过getClass()获取到clazz对象
        Class<? extends UserController> clazz = userController.getClass();
        // 创建一个对象
        UserService userService = new UserService();
        // 打印内存地址
        System.out.println(userService);
        // 获取所有的属性
        Field userServiceField = clazz.getDeclaredField("userService");
        // 因为对应的get方法为private，所以需要设置可访问
        userServiceField.setAccessible(true);
        // 属性没办法直接操作，只有通过方法才能设置具体属性值
        String name = userServiceField.getName();
        // 拼接方法的名称
        name = name.substring(0, 1).toUpperCase() + name.substring(1, name.length());

        String setMethodName = "set" + name;
        // 通过方法注入属性的对象
        Method method = clazz.getMethod(setMethodName, UserService.class);

        // 反射
        method.invoke(userController, userService);
        // 再次打印userService内存地址，如果上下两次北村地址相同，说明我们已经将userService注入到了userController
        System.out.println(userController.getUserService());

    }
}
